package leetcode.year2021.month10;

//55. 跳跃游戏
public class _19_01CanJump55 {
  public static void main(String[] args) {
    int[] nums = new int[]{3,2,1,0,4};
    System.out.println(canJump(nums));

  }
  // 思路，从后往前遍历，找到每一个能到最后位置的点作为最后位置
  public static boolean canJump(int[] nums) {
    int right = nums.length-1;
    while (right > 0){
      right = canJumpHere(nums,right);
      if (right == -1){
        return false;
      }
    }
    return true;
  }

  private static int canJumpHere(int[] nums, int right) {
    for (int i = right; i > 0; i--) {
      if (nums[i-1]+(i-1) >= right){
        return i-1;
      }
    }
    return -1;
  }

  /**
   *     public boolean canJump(int[] nums) {
   *         int n = nums.length;
   *         int rightmost = 0;
   *         for (int i = 0; i < n; ++i) {
   *             if (i <= rightmost) {
   *                 rightmost = Math.max(rightmost, i + nums[i]);
   *                 if (rightmost >= n - 1) {
   *                     return true;
   *                 }
   *             }
   *         }
   *         return false;
   *     }
   *
   */


  /**
   * 55. 跳跃游戏
   * 给定一个非负整数数组 nums ，你最初位于数组的 第一个下标 。
   *
   * 数组中的每个元素代表你在该位置可以跳跃的最大长度。
   *
   * 判断你是否能够到达最后一个下标。
   *
   *
   *
   * 示例 1：
   *
   * 输入：nums = [2,3,1,1,4]
   * 输出：true
   * 解释：可以先跳 1 步，从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
   * 示例 2：
   *
   * 输入：nums = [3,2,1,0,4]
   * 输出：false
   * 解释：无论怎样，总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 ， 所以永远不可能到达最后一个下标。
   *
   *
   * 提示：
   *
   * 1 <= nums.length <= 3 * 104
   * 0 <= nums[i] <= 105
   */
}
